home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
United Public Domain Gold 4
/
United Public Domain Gold 4.iso
/
fredfish
/
ff.0028.dms
/
ff.0028.adf
/
SuperBitMap
/
super.c
< prev
Wrap
C/C++ Source or Header
|
1986-07-16
|
9KB
|
325 lines
/* Super.c - superbitmap scrolling and printing demo - Requires 1.2 */
/* phillip lindsay / carolyn scheppner */
/* CBM 06/30/86 */
#include "exec/types.h"
#include "exec/execbase.h"
#include "exec/exec.h"
#include "graphics/gfxbase.h"
#include "graphics/rastport.h"
#include "graphics/layers.h"
#include "intuition/intuition.h"
#include "devices/printer.h"
/* constants */
#define SBWIDTH 800
#define SBHEIGHT 400
#define WIDTH 640
#define HEIGHT 200
#define MAXWIDTH WIDTH
#define MAXHEIGHT HEIGHT
#define MINWIDTH (MAXWIDTH/16)
#define MINHEIGHT (MAXHEIGHT/8)
#define DEPTH 2 /* bitplanes */
#define COLORS 4 /* COLORS = pow(DEPTH,2); */
#define NORMAL -1 /* value used for normal Abort() */
/* functions we want to declare */
long OpenLibrary();
struct IntuiMessage *GetMsg();
struct Window *OpenWindow();
/* external I want to see */
extern long SysBase;
/* working base pointers - pre-initialized for simplified aborting */
struct GfxBase *GfxBase = 0;
struct IntuitionBase *IntuitionBase = 0;
/* our window structures...*/
struct NewWindow mynuwindow =
{
0,0,WIDTH,HEIGHT,
0,1,
CLOSEWINDOW | VANILLAKEY,
GIMMEZEROZERO | SUPER_BITMAP | WINDOWDEPTH | WINDOWCLOSE |
WINDOWSIZING | WINDOWDRAG | ACTIVATE,
NULL,NULL,
"1.2 SuperBitMap Demo - SPACE=Draw/Pause UDLR=Scroll P=Print Q=Quit",
NULL,
NULL,
MINWIDTH,MINHEIGHT,
MAXWIDTH,MAXHEIGHT,
WBENCHSCREEN
};
/* Window related structures */
struct Window *mywindow;
struct ViewPort *vp;
struct RastPort *rp;
struct BitMap bitmap;
/* Intuition IDCMP stuff */
struct IntuiMessage *msg;
ULONG class;
USHORT code;
/* Layer stuff */
ULONG LayersBase;
struct Layer *l;
struct Layer_Info *li;
/**************************************************************************/
main()
{
long count, /* misc. loop var. */
gapX, gapY, /* holds current val for the line gap */
cycle, /* this is the current color register being used */
x,y; /* current line dest. coor. */
UBYTE do_close; /* this flag is TRUE for window close gadget selected */
UBYTE freeze; /* flag to freeze display */
int error; /* for return value of superDump() */
int deltaX, deltaY; /* scroll deltas */
int k;
/* Initialize PLANEPTR's to ZERO for simple deallocating */
for(k=0; k<DEPTH; k++) bitmap.Planes[k] = NULL;
GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0);
Abort(GfxBase,"Can't open Graphics library");
IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0);
Abort(IntuitionBase,"Can't open Intuition library");
LayersBase = OpenLibrary("layers.library",0);
Abort(LayersBase,"Can't open Layers library");
/* let's get our bitplanes */
InitBitMap(&bitmap,DEPTH,SBWIDTH,SBHEIGHT);
for(count=0;count < DEPTH;count++)
if((bitmap.Planes[count] = (PLANEPTR) AllocRaster(SBWIDTH,SBHEIGHT)) == NULL)
Abort(NULL,"No memory for bitplanes.");
else
BltClear(bitmap.Planes[count],RASSIZE(SBWIDTH,SBHEIGHT),NULL);
mynuwindow.BitMap = &bitmap; /* tell mynuwindow where our bitmap is */
Abort((mywindow = OpenWindow(&mynuwindow)),"Can't open window");
rp = mywindow->RPort;
vp = (struct ViewPort *) ViewPortAddress(mywindow);
l = rp->Layer;
li = l->LayerInfo;
deltaX = 4;
deltaY = 2;
SetDrMd(rp,JAM1);
/* Initialize flags to defaults */
do_close=0x00;
freeze = FALSE;
/* Loop until close gadget hit */
while(!do_close)
{
if(!freeze)
{
x = RangeRand(SBWIDTH);
y = RangeRand(SBHEIGHT);
gapX = RangeRand(4)+2;
gapY = RangeRand(4)+2;
cycle = RangeRand(4);
SetAPen(rp,cycle);
for (; ((x < SBWIDTH)&&(y > 0)); x += gapX, y -= gapY)
{
Move(rp,0,y);
Draw(rp,x,0);
Move(rp,SBWIDTH-1-x,0);
Draw(rp,SBWIDTH-1,y);
Move(rp,SBWIDTH-1,SBHEIGHT-1-y);
Draw(rp,SBWIDTH-1-x,SBHEIGHT-1);
Move(rp,x,SBHEIGHT-1);
Draw(rp,0,SBHEIGHT-1-y);
}
}
while(msg=(struct IntuiMessage *)GetMsg(mywindow->UserPort))
{
class = msg->Class;
code = msg->Code;
ReplyMsg(msg);
switch(class)
{
case CLOSEWINDOW:
do_close = TRUE;
break;
case VANILLAKEY:
switch(code)
{
case 'u':
if((l->Scroll_Y + deltaY) < maxYScroll(mywindow) )
ScrollLayer(li,l,0,deltaY);
break;
case 'd':
if((l->Scroll_Y - deltaY) > 0 )
ScrollLayer(li,l,0,-deltaY);
break;
case 'l':
if((l->Scroll_X + deltaX) < maxXScroll(mywindow) )
ScrollLayer(li,l,deltaX,0);
break;
case 'r':
if((l->Scroll_X-deltaX) > 0 )
ScrollLayer(li,l,-deltaX,0);
break;
case ' ':
freeze = (freeze == TRUE) ? FALSE : TRUE;
break;
case 'p':
/* ScreenDump of SuperBitMap */
error = superDump(rp,vp);
if (error) printf("DumpRPort error = %ld\n",error);
break;
case 'q':
do_close = TRUE;
break;
}
}
}
}
Abort(NORMAL,"\nGoodbye..");
}
/* Abort - an easy going exit routine - if val <= 0 a clean-up and exit will */
/* take place...val == 0 implies ERROR...val == -1 implies normal exit */
/* and val >= 1 implies no exit or error */
Abort(val,str)
long val;
UBYTE *str;
{
long count;
if(val < 1)
{
puts(str);
if(mywindow) msgflush(),CloseWindow(mywindow);
if(bitmap.Planes[0] != NULL)
for(count=0;(bitmap.Planes[count] != NULL) && (count < 8);count++)
FreeRaster(bitmap.Planes[count],SBWIDTH,SBHEIGHT);
if(GfxBase) CloseLibrary(GfxBase);
if(IntuitionBase) CloseLibrary(IntuitionBase);
if(LayersBase) CloseLibrary(LayersBase);
exit(val == 0 ? 1 : 0);
}
}
/* msgflush - get/reply to all messages */
msgflush()
{
while((msg = GetMsg(mywindow->UserPort))) ReplyMsg(msg);
}
int maxXScroll(w)
struct Window *w;
{
return(SBWIDTH - (w->Width - w->BorderLeft - w->BorderRight));
}
int maxYScroll(w)
struct Window *w;
{
return(SBHEIGHT - (w->Height - w->BorderTop - w->BorderBottom));
}
/***************************/
/* SuperBitmap Screen Dump */
/***************************/
superDump(rp,vp)
struct RastPort *rp;
struct ViewPort *vp;
{
/* printer stuff */
union printerIO {
struct IOStdReq ios;
struct IODRPReq iodrp;
struct IOPrtCmdReq iopc;
};
union printerIO *request;
extern struct IORequest *CreateExtIO();
extern struct MsgPort *CreatePort();
struct MsgPort *printerPort;
struct RastPort dRastPort; /* Dummy RastPort */
int error;
/* Lock the Layer */
/* Update the SuperBitmap */
/* Copy window's Rastport structure to dummy */
/* Insert ptr to our SuperBitmap */
/* NULL the Layer pointer */
/* Unlock the Layer */
LockLayerRom(rp->Layer);
SyncSBitMap(rp->Layer);
dRastPort = *rp;
dRastPort.BitMap = rp->Layer->SuperBitMap;
dRastPort.Layer = NULL;
UnlockLayerRom(rp->Layer);
printerPort = CreatePort("my.print.port",0);
request = (union printerIO *)CreateExtIO(printerPort,
sizeof(union printerIO));
error = OpenDevice("printer.device",0,request,0);
if(error != 0) goto cleanup2;
request->iodrp.io_Command = PRD_DUMPRPORT;
request->iodrp.io_RastPort = &dRastPort;
request->iodrp.io_ColorMap = vp->ColorMap;
request->iodrp.io_Modes = (ULONG)vp->Modes;
/* request->iodrp.io_SrcX = 0; MEMF_CLEAR zeroed this */
/* request->iodrp.io_SrcY = 0; MEMF_CLEAR zeroed this */
request->iodrp.io_SrcWidth = SBWIDTH;
request->iodrp.io_SrcHeight = SBHEIGHT;
request->iodrp.io_DestCols = SBWIDTH;
/* request->iodrp.io_DestRows = 0; MEMF_CLEAR zeroed this */
request->iodrp.io_Special = SPECIAL_ASPECT;
error = DoIO(request);
CloseDevice(request);
cleanup2:
DeleteExtIO(request, sizeof(union printerIO));
DeletePort(printerPort);
cleanup1:
cleanup0:
return(error);
} /* end of demo screen dump */
/* EOF */